#include "../inc/Grille.h"

bool Grille::ligneNumeroGagnante(int numLigne, char c)
{
    bool testGagnant = true;

    for (int i = 0; i < this->nColonnes && testGagnant ; i++)
    {
        if(this->grille[numLigne-1][i]!=c)
            testGagnant = false;
    }

    return testGagnant;
}

bool Grille::colonneNumeroGagnante(int numColonne, char c) {
    bool testGagnant = true;

    for (int i = 0; i < this->nLignes && testGagnant ; i++)
    {
        if(this->grille[i][numColonne-1]!=c)
            testGagnant = false;
    }

    return testGagnant;
}

bool Grille::diagHautGaucheGagnante(char c) {
    bool testGagnant = true;

    if(!this->estCarree()) testGagnant = false;

    for (int i = 0; i < this->nLignes && testGagnant ; i++)
    {
        if(this->grille[i][i]!=c)
            testGagnant = false;
    }

    return testGagnant;
}

bool Grille::diagHautDroiteGagnante(char c) {
    bool testGagnant = true;

    if(!this->estCarree()) testGagnant = false;

    for (int i = 0; i < this->nLignes && testGagnant ; i++)
    {
        if(this->grille[nLignes-i-1][i]!=c)
            testGagnant = false;
    }

    return testGagnant;
}


bool Grille::gagne(char c) {
    bool testGagnant = false;

    for(int i=0;i<this->nLignes && !testGagnant;i++)
    {
        testGagnant = this->ligneNumeroGagnante(i+1,c);
    }

    for(int i=0;i<this->nColonnes && !testGagnant;i++)
    {
        testGagnant = this->colonneNumeroGagnante(i+1,c);
    }

    if(!testGagnant) testGagnant = this->diagHautDroiteGagnante(c);

    if(!testGagnant) testGagnant = this->diagHautGaucheGagnante(c);

    return testGagnant;
}

bool Grille::xGagne()
{
    return this->gagne('X');
}

bool Grille::oGagne() {
    return this->gagne('O');
}


bool Grille::estCarree() {
    return nLignes==nColonnes;
}


void Grille::setValeur(int l, int c,char val ) {
    this->grille[l-1][c-1] = val;

}

char Grille::getValeur(int l, int c) {
    return this->grille[l-1][c-1];
}
